package com.bitbakery.plugin.scheme.lang.psi;

import com.bitbakery.plugin.scheme.lang.SchemeLanguage;
import com.intellij.lang.Language;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.IFileElementType;
import com.intellij.psi.tree.TokenSet;

public interface SchemeElementTypes {
    IFileElementType FILE = new IFileElementType(Language.findInstance(SchemeLanguage.class));

    IElementType VARIABLE_NAME = new SchemeElementType("variable name");
    IElementType VARIABLE_DEFINITION = new SchemeElementType("variable definition");
    IElementType GLOBAL_VARIABLE_DEFINITION = new SchemeElementType("global variable definition");
    IElementType GLOBAL_CONSTANT_DEFINITION = new SchemeElementType("global constant definition");

    IElementType ANONYMOUS_FUNCTION_DEFINITION = new SchemeElementType("anonymous function definition");
    IElementType FUNCTION_DEFINITION = new SchemeElementType("function definition");

    IElementType DOCSTRING = new SchemeElementType("docstring");

    IElementType FORMAL_PARAMETER_LIST = new SchemeElementType("formal parameter list");
    IElementType REGULAR_PARAMETER_LIST = new SchemeElementType("regular parameter list");

    IElementType REGULAR_PARAMETER = new SchemeElementType("regular parameter");

    IElementType FUNCTION_CALL = new SchemeElementType("function call");
    IElementType FUNCTION_NAME = new SchemeElementType("function name");

    IElementType FUNCTION_BODY = new SchemeElementType("function body");

    IElementType ARGUMENT_LIST = new SchemeElementType("argument list");
    IElementType ARGUMENT = new SchemeElementType("argument");

    IElementType COND_STATEMENT = new SchemeElementType("cond statement");
    IElementType IF_STATEMENT = new SchemeElementType("if statement");
    IElementType LET_STATEMENT = new SchemeElementType("let statement");
    IElementType LET_VARIABLE_NAME = new SchemeElementType("let variable name");

    // ????
    TokenSet SOURCE_ELEMENTS = TokenSet.create(
            FUNCTION_DEFINITION
    );
}
